package references

import (
	"hi-jvm/instructions/base"
	"hi-jvm/rtda"
	"hi-jvm/rtda/heap"
)

/*
操作数为一个16位的索引，来自字节码。
 */
// Create new object
type NEW struct{ base.Index16Instruction }

/*
通过这个索引，可以从当前类的运行时常量池中找到一个类符号引用。
解析这个类符号引用，拿到类数据，然后创建对象
并把对象引用推入栈顶。
 */
func (self *NEW) Execute(frame *rtda.Frame) {
	cp := frame.Method.Class.ConstantPool
	classRef := cp.GetConstant(self.Index).(*heap.ClassRef)
	class := classRef.ResolvedClass()
	// todo: init class

	if !class.InitClassIfNotInited(frame) {
		return
	}

	if class.IsInterface() || class.IsAbstract() {
		panic("java.lang.InstantiationError")
	}

	ref := class.NewObject()
	frame.OperandStack.PushRef(ref)
}
